Services a DCOM
Otázka od: Zbysek Hlinka
18. 9. 2002 17:18
Ahoj,
mate nekdo zkusenost s provozovanim DCOM a services?
Jaky je stav: exac, ktery ma COM interface a bezi na jednom pocitaci.
Dalsi program na jinem pocitaci se k tomuto programu pripojuje a
komunikuje s mim pres interface. Pokud je prvni program spusten
normalne, vse beha OK. Nedari ze vsak pripojeni, pokud je prvni
program spusten jako service, druhy program ho neumi najit. Nevi
nekdo, kde by mohl byt problem?
S pozdravem
Zbysek Hlinka
E-mail: hlinka@hlinka.cz, localizator@localizator.com
Phone: +420 603 551 282
Odpovedá: Jan Sebelík
19. 9. 2002 9:14
Subject: Re: Services a DCOM
Ahoj Zbysku,
dotaz posilam v kopii V.Bodeckovi (kurz COM/DCOM).
Podle meho soudu to je otazka security.
Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 0434 692 569 (0776 347735)
=========================================
----------
> Odesílatel: Zbysek Hlinka <hlinka@hlinka.cz>
> Komu: delphi-l@clexpert.cz
> Předmět: Services a DCOM
> Datum: 18. září 2002 16:27
>
> Ahoj,
>
> mate nekdo zkusenost s provozovanim DCOM a services?
>
> Jaky je stav: exac, ktery ma COM interface a bezi na jednom pocitaci.
> Dalsi program na jinem pocitaci se k tomuto programu pripojuje a
> komunikuje s mim pres interface. Pokud je prvni program spusten
> normalne, vse beha OK. Nedari ze vsak pripojeni, pokud je prvni
> program spusten jako service, druhy program ho neumi najit. Nevi
> nekdo, kde by mohl byt problem?
>
> S pozdravem
>
> Zbysek Hlinka
> E-mail: hlinka@hlinka.cz, localizator@localizator.com
> Phone: +420 603 551 282
Odpovedá: Alexandr Stefek
19. 9. 2002 16:53
Krome Nastaveni security je potreba do registru nastavit jeste nejake
klice (napr. LocalService pod, tusim CLSID).
Ja osobne pridavam do .dpr napr. nasledujici kod (samozrejme lze
optimalizovat):
begin
ComServer.UIInteractive := False;
if FindSwitch('INSTALL') then begin
CreateRegKey('CLSID\' + GUIDToString(CLASS_TransferOBJ), 'AppID',
GUIDToString(CLASS_TransferOBJ));
CreateRegKey('AppID\' + GUIDToString(CLASS_TransferOBJ), '',
'TransferOBJ');
CreateRegKey('AppID\' + GUIDToString(CLASS_TransferOBJ), 'LocalService',
'TransferLayer');
end else
if FindSwitch('UNINSTALL') then begin
DeleteRegKey('CLSID\' + GUIDToString(CLASS_TransferOBJ));
DeleteRegKey('AppID\' + GUIDToString(CLASS_TransferOBJ));
end;
Pritom CLASS_TransferOBJ je GUID tridy,
TransferLayer je nazev sluzby, ktera DCOM obsluhuje.
Dale je potreba do implementacni unity pridat
initialization
if not (FindSwitch('INSTALL') or FindSwitch('UNINSTALL')) then begin
TAutoObjectFactory.Create(ComServer, TTransferOBJ, Class_TransferOBJ,
ciMultiInstance, tmApartment);
end;
V opacne pripade to pri instalaci dela problemy (pokud si vzpominam).
Snad to pro zacatek staci.
Alexandr STEFEK
----- Original Message -----
From: "Zbysek Hlinka" <hlinka@hlinka.cz>
To: <delphi-l@clexpert.cz>
Sent: Wednesday, September 18, 2002 4:27 PM
Subject: Services a DCOM
> Ahoj,
>
> mate nekdo zkusenost s provozovanim DCOM a services?
>
> Jaky je stav: exac, ktery ma COM interface a bezi na jednom pocitaci.
> Dalsi program na jinem pocitaci se k tomuto programu pripojuje a
> komunikuje s mim pres interface. Pokud je prvni program spusten
> normalne, vse beha OK. Nedari ze vsak pripojeni, pokud je prvni
> program spusten jako service, druhy program ho neumi najit. Nevi
> nekdo, kde by mohl byt problem?
>
> S pozdravem
>
> Zbysek Hlinka
> E-mail: hlinka@hlinka.cz, localizator@localizator.com
> Phone: +420 603 551 282
>
Odpovedá: Zbysek Hlinka
20. 9. 2002 10:43
On 19 Sep 2002 at 15:49, Alexandr Stefek wrote:
> Krome Nastaveni security je potreba do registru nastavit jeste nejake
> klice (napr. LocalService pod, tusim CLSID). Ja osobne pridavam do
> .dpr napr. nasledujici kod (samozrejme lze optimalizovat):
Zkousel jsem ruzne moznosti, ale vzdy mi to hlasilo nejakou chybu. V
nejlepsim pripade, ze pristup byl odepren. Mam to blbe umistene, nebo
je treba jeste neco nekde nastavit? Takto vypada .dpr:
{$R *.TLB}
{$R *.RES}
function Installing: Boolean;
begin
Result := FindCmdLineSwitch('INSTALL', ['-','\','/'], True) or
FindCmdLineSwitch('UNINSTALL', ['-','\','/'], True);
end;
function StartService: Boolean;
var
Mgr, Svc: Integer;
UserName, ServiceStartName: string;
Config: Pointer;
Size: DWord;
begin
Result := False;
Mgr := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if Mgr <> 0 then
begin
Svc := OpenService(Mgr, PChar(SServiceName), SERVICE_ALL_ACCESS);
Result := Svc <> 0;
if Result then
begin
QueryServiceConfig(Svc, nil, 0, Size);
Config := AllocMem(Size);
try
QueryServiceConfig(Svc, Config, Size, Size);
ServiceStartName :=
PQueryServiceConfig(Config)^.lpServiceStartName;
if CompareText(ServiceStartName, 'LocalSystem') = 0 then
ServiceStartName := 'SYSTEM';
finally
Dispose(Config);
end;
CloseServiceHandle(Svc);
end;
CloseServiceHandle(Mgr);
end;
if Result then
begin
Size := 256;
SetLength(UserName, Size);
GetUserName(PChar(UserName), Size);
SetLength(UserName, StrLen(PChar(UserName)));
Result := CompareText(UserName, ServiceStartName) = 0;
end;
end;
begin
if not Installing then
begin
CreateMutex(nil, True, 'QM1MAINSERV');
if GetLastError = ERROR_ALREADY_EXISTS then
begin
MessageBox(0, PChar(SAlreadyRunning), PChar(SApplicationName),
MB_ICONERROR);
Halt;
end;
end;
ComServer.UIInteractive := False;
if FindCmdLineSwitch('INSTALL', ['-','\','/'], True) then begin
CreateRegKey('CLSID\' + GUIDToString(CLASS_QMCommunics),
'AppID', GUIDToString(CLASS_QMCommunics));
CreateRegKey('AppID\' + GUIDToString(CLASS_QMCommunics), '',
SServiceName);
CreateRegKey('AppID\' + GUIDToString(CLASS_QMCommunics),
'LocalService', SServiceName);
end else
if FindCmdLineSwitch('UNINSTALL', ['-','\','/'], True) then
begin
DeleteRegKey('CLSID\' + GUIDToString(CLASS_QMCommunics));
DeleteRegKey('AppID\' + GUIDToString(CLASS_QMCommunics));
end;
if Installing or StartService then
begin
SvcMgr.Application.Initialize;
SocketService := TSocketService.CreateNew(SvcMgr.Application, 0);
SvcMgr.Application.CreateForm(TQMForm, QMForm);
SvcMgr.Application.Run;
end else
begin
Forms.Application.ShowMainForm := False;
Forms.Application.Initialize;
Forms.Application.CreateForm(TQMForm, QMForm);
QMForm.Initialize(False);
Forms.Application.Run;
end;
end.
S pozdravem
Zbysek Hlinka
E-mail: hlinka@hlinka.cz, localizator@localizator.com
Phone: +420 603 551 282
Odpovedá: Zbysek Hlinka
20. 9. 2002 13:00
On 20 Sep 2002 at 8:38, Zbysek Hlinka wrote:
> On 19 Sep 2002 at 15:49, Alexandr Stefek wrote:
>
> > Krome Nastaveni security je potreba do registru nastavit jeste
> > nejake klice (napr. LocalService pod, tusim CLSID). Ja osobne
> > pridavam do .dpr napr. nasledujici kod (samozrejme lze
> > optimalizovat):
>
> Zkousel jsem ruzne moznosti, ale vzdy mi to hlasilo nejakou chybu. V
> nejlepsim pripade, ze pristup byl odepren.
Jeste bych mel rict, ze klient se snazi spustit instanci serveru,
ktera uz bezi. Dalsi instanci spustit lze, ale to neni zadouci.
S pozdravem
Zbysek Hlinka
E-mail: hlinka@hlinka.cz, localizator@localizator.com
Phone: +420 603 551 282
Odpovedá: Malecek Ondrej
20. 9. 2002 13:21
> -----Původní zpráva-----
> > Krome Nastaveni security je potreba do registru nastavit jeste
> > > nejake klice (napr. LocalService pod, tusim CLSID). Ja osobne
> > > pridavam do .dpr napr. nasledujici kod (samozrejme lze
> > > optimalizovat):
> >
> > Zkousel jsem ruzne moznosti, ale vzdy mi to hlasilo nejakou chybu. V
> > nejlepsim pripade, ze pristup byl odepren.
>
> Jeste bych mel rict, ze klient se snazi spustit instanci serveru,
> ktera uz bezi. Dalsi instanci spustit lze, ale to neni zadouci.
---------------------------------------------------------
Tohle resim prepsanim TAutoObjectFactory.CreateInstance v jejim potomkovi,
ktera mi vraci jednu a tu samou instanci a nevytavri dalsi. Mam dojem, ze
jeste bylo potreba class factory registrovat pomoci RegisterClassObject,
jinac se vytvari i dalsi instance class factory. Ale to si nejsem jist
jestli neni potreba pouze pri pouziti v jinem nez primarnim vlaknu.
Nepouzivam to tedy v service, ale postup je to obecne platny.
O
Odpovedá: Alexandr Stefek
23. 9. 2002 7:08
> On 20 Sep 2002 at 8:38, Zbysek Hlinka wrote:
>
> > On 19 Sep 2002 at 15:49, Alexandr Stefek wrote:
> >
> > > Krome Nastaveni security je potreba do registru nastavit jeste
> > > nejake klice (napr. LocalService pod, tusim CLSID). Ja osobne
> > > pridavam do .dpr napr. nasledujici kod (samozrejme lze
> > > optimalizovat):
> >
> > Zkousel jsem ruzne moznosti, ale vzdy mi to hlasilo nejakou chybu. V
> > nejlepsim pripade, ze pristup byl odepren.
>
> Jeste bych mel rict, ze klient se snazi spustit instanci serveru,
> ktera uz bezi. Dalsi instanci spustit lze, ale to neni zadouci.
>
Je dobre se pomoci dcomcnfg presvedcit, ze je DCOM
pripojen skutecne na sluzbu (samozrejme po instalaci apod.)
(popisovany jev nastava ve chvili, kdy to neni OK)
V patricnem dialogu se objevi (nemam to ted pred sebou, takze
potim z hlavy) RunAs, nebo neco takoveho a tamtez by mela
byt zvolena volba service ci co.
Pozor tento zpusob ale je pseudo DCOM service, vse bezi v hlavnim vlaknu.
Presto, mam to overeno jako celkem funkcni.
Doporucuji se podivat na
http://www.aldyn.ru/articles/dcom_in_service/index.html
Ale s trochou casu a usili by to mohlo jit jeste poopravit, aby to vse
bylo OK.
Alexandr STEFEK